1. Were any species found on all three islands? If so, which one(s). Are the number of males and females in the data set roughly balanced for each species? Note: the “table” command will be useful for this problem.
# Packages
#install.packages("tidyverse") # hash once used
library(tidyverse)
library(ggplot2)
library(dplyr)

# Loading the data
penguins <- read.csv("penguins.csv")

table(penguins$species, penguins$sex)
           
            female male
  Adelie        73   73
  Chinstrap     34   34
  Gentoo        58   61

The Adelie and Chinstrap are perfectly balanced while the Gentoo is roughly balanced (3 off)

  1. Make a side-by-side boxplot comparing bill length for males and females. Do a t-test testing the null hypothesis that mean bill length is the same for males and females. What is your conclusion? Make a QQ-plot of bill length for males, make a separate QQ- plot of bill length for females. Are the t-test conditions satisfied? Also do the Wilcox- Mann-Whitney test. Do the t-test and Wilcox-Mann-Whitney test agree?
# bill length males vs females
ggplot(penguins, aes(x = sex, y = bill_length_mm)) + geom_boxplot() + labs(title = "Bill Length by Sex", x = "Sex", y = "Bill Length (mm)")


# T-test
t_test <- t.test(bill_length_mm ~ sex, data = penguins)
print(t_test)

    Welch Two Sample t-test

data:  bill_length_mm by sex
t = -6.6725, df = 329.29, p-value = 1.066e-10
alternative hypothesis: true difference in means between group female and group male is not equal to 0
95 percent confidence interval:
 -4.865676 -2.649908
sample estimates:
mean in group female   mean in group male 
            42.09697             45.85476 
# QQ plot
qqnorm(penguins$bill_length_mm[penguins$sex == "male"], main = "QQ Plot: Males")
qqline (penguins$bill_length_mm[penguins$sex == "male"])

qqnorm(penguins$bill_length_mm[penguins$sex == "female"], main = "QQ Plot: Females")
qqline(penguins$bill_length_mm[penguins$sex == "female"])


# Wilcox-Mann-Whitney test
wmw <- wilcox.test(bill_length_mm ~ sex, data = penguins)
print(wmw)

    Wilcoxon rank sum test with continuity correction

data:  bill_length_mm by sex
W = 8178, p-value = 9.901e-11
alternative hypothesis: true location shift is not equal to 0

Males have a statistically longer bill on average. Both tests strongly reject the null hypothesis at a = 0.05. The t-test assumptions are normal and robust with the Wilcoxon test confirming it. Overall, yes both the t-test and the WMW test led to the same conclusion of males having a confirmed larger beak size on average.

  1. Make a side-by-side boxplot comparing bill length for all three species. Do a one-way ANOVA to test the null hypothesis that all three specie have the same mean bill length. Show the ANOVA table. What is your conclusion? Make a QQ-plot of the residuals. Make a plot of the residuals vs. the group means. Are the ANOVA conditions satisfied?
# Species' boxplots
ggplot(penguins, aes(x = species, y = bill_length_mm)) + geom_boxplot() + labs(title = "Bill Length by Species", x = "Species", y = "Bill Length (mm)")


# ANOVA
anova_result <- aov(bill_length_mm ~ species, data = penguins)
summary (anova_result)
             Df Sum Sq Mean Sq F value Pr(>F)    
species       2   7015    3508   397.3 <2e-16 ***
Residuals   330   2914       9                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Residuals
residuals_anova <- residuals(anova_result)
qqnorm(residuals_anova)
qqline(residuals_anova)

group_means <- tapply(penguins$bill_length_mm, penguins$species, mean, na.rm=TRUE)
means_lookup <- setNames(group_means, names(group_means))
group_mean_values <- means_lookup[as.character(penguins$species)]

plot(group_mean_values, residuals(anova_result),
     main = "Residuals vs Group Means", xlab = "Group Mean", ylab = "Residuals")

The ANOVA conditions appear to be satisfied because the QQ-plot of residuals shows that the points are approximately linear (normal) and the residuals vs group means plot doesnt have a clear pattern (homoscedasticity) confirming there is a significant difference in mean bill length among the three species.

  1. Make a side-by-side boxplot showing bill length as a function of both sex and species. Do a two-way ANOVA. Show the ANOVA table. For a two-way ANOVA there are three null hypotheses, what are your three conclusions? Make a QQ-plot of the residuals. Make a plot of the residuals vs. the group means. Are the ANOVA conditions satisfied?
ggplot(penguins, aes(x = species, y = bill_length_mm, fill = sex)) + geom_boxplot(position = position_dodge(0.8)) + labs(title = "Bill Length by Sex and Species", x = "Species", y = "Bill Length (mm)")


# 2-way ANOVA
two_way <- aov(bill_length_mm ~ species * sex, data = penguins)
summary(two_way)
             Df Sum Sq Mean Sq F value Pr(>F)    
species       2   7015    3508 654.189 <2e-16 ***
sex           1   1136    1136 211.807 <2e-16 ***
species:sex   2     24      12   2.284  0.103    
Residuals   327   1753       5                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Checking residuals
residuals_two_way <- residuals(two_way)
qqnorm(residuals_two_way)
qqline(residuals_two_way)


plot(fitted(two_way), residuals_two_way, main = "Residuals vs Fitted (2-way ANOVA)", xlab = "Fitted Values", ylab= "Residuals")

We tested if there was no difference in bill length among species, that was rejected as null due to p < 2e-16. We tested if there was no difference in bill length among sexes, that was rejected as null due to p < 2e-16. Then we tested if there was no interaction between species and sex, which we didn’t reject as null because p = 0.103. The ANOVA conditions appear to be satisfied because the QQ-plot of residuals shows that the points are approximately linear (normal) and the residuals vs group means plot doesnt have a clear pattern (homoscedasticity) confirming there is a significant difference in mean bill length among the three species.

  1. Make a scatter plot with bill length on the x-axis and bill depth on the y-axis. Compute the correlation. Compute the least squares line, and add the least squares line to your plot. Is the slope (and the correlation) significantly different than zero? If so, does the sign of the slope (and correlation) surprise you? Make a QQ-plot of the residuals. Make a plot with bill length on the x-axis and the residuals on the y-axis. Are the linear model assumptions satisfied?
# Scatter plot + LR for all species
ggplot(penguins, aes(x = bill_length_mm, y = bill_depth_mm)) + geom_point() + geom_smooth(method = "lm", se = FALSE) + labs(title = "Bill Length vs Bill Depth", x = "Bill Length (mm)", y = "Bill Depth (mm)")

cor(penguins$bill_length_mm, penguins$bill_depth_mm, use = "complete.obs")
[1] -0.2286256
lm_all <- lm(bill_depth_mm ~ bill_length_mm, data = penguins)
summary (lm_all)

Call:
lm(formula = bill_depth_mm ~ bill_length_mm, data = penguins)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.1548 -1.4291  0.0122  1.3994  4.5004 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)    20.78665    0.85417  24.335  < 2e-16 ***
bill_length_mm -0.08233    0.01927  -4.273 2.53e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.92 on 331 degrees of freedom
Multiple R-squared:  0.05227,   Adjusted R-squared:  0.04941 
F-statistic: 18.26 on 1 and 331 DF,  p-value: 2.528e-05
# residuals
residuals_lm <- residuals(lm_all)
qqnorm(residuals_lm)
qqline(residuals_lm)


plot(penguins$bill_length_mm, residuals_lm, main = "Residuals vs Bill Length", xlab = "Bill Length (mm)", ylab = "Residuals")

We tested if the slope between bill length and bill depth was zero, which was rejected as null because the p-value was 2.53e-05. We also tested if the correlation was zero, and that was also rejected as null due to the same p-value. The negative sign of both the slope and the correlation was surprising, since we might expect longer bills to also be deeper. The linear model assumptions appear to be satisfied because the QQ-plot of residuals shows that the points are approximately linear (normal), and the residuals vs bill length plot does not show any strong curvature or spread (homoscedasticity). The color-coded plot by species helps explain the surprising negative slope, since different species have distinct bill shapes (e.g., Gentoo penguins have longer, shallower bills while Chinstrap have shorter, deeper ones), which creates a misleading negative trend across all species even if the trend within each species is positive.

Next repeat everything in the previous paragraph, but just for the species Adelie.

adelie <- filter(penguins, species == "Adelie")

ggplot(adelie, aes(x = bill_length_mm, y = bill_depth_mm)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Adelie: Bill Length vs Bill Depth", x = "Bill Length", y = "Bill Depth")


cor(adelie$bill_length_mm, adelie$bill_depth_mm, use = "complete.obs")
[1] 0.3858132
lm_adelie <- lm(bill_depth_mm ~ bill_length_mm, data = adelie)
summary(lm_adelie)

Call:
lm(formula = bill_depth_mm ~ bill_length_mm, data = adelie)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.1487 -0.7926 -0.0842  0.5550  3.4990 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)    11.48771    1.37010   8.385 4.23e-14 ***
bill_length_mm  0.17668    0.03521   5.018 1.51e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.129 on 144 degrees of freedom
Multiple R-squared:  0.1489,    Adjusted R-squared:  0.1429 
F-statistic: 25.18 on 1 and 144 DF,  p-value: 1.515e-06
residuals_adelie <- residuals(lm_adelie)
qqnorm(residuals_adelie)
qqline(residuals_adelie)


plot(adelie$bill_length_mm, residuals_adelie,
     main = "Adelie Residuals vs Bill Length", xlab = "Bill Length", ylab = "Residuals")

We tested if the slope between bill length and bill depth for Adelie penguins was zero, which we rejected as null because the p-value was 1.51e-06. We also tested if the correlation was zero, which was rejected as null since the correlation was 0.386 with a significant p-value. The positive slope and correlation are not surprising for this species, since it makes sense that longer bills would also be deeper. The linear model assumptions appear to be satisfied because the QQ-plot of residuals is approximately linear (normal), and the residuals vs bill length plot shows no strong patterns or fanning (homoscedasticity).

Finally make another scatter plot with bill length on the x-axis and bill depth on the y- axis. This plot should include all three species, but the species should be color-coded (i.e., use one color for the Adelie penguins, a second color for the Chinstrap penguins,1 and a third color for the Gentoo penguins). Does this figure explain the surprising observation about the sign of the slopes?

ggplot(penguins, aes(x = bill_length_mm, y = bill_depth_mm, color = species)) +
  geom_point() +
  labs(title = "Bill Dimensions by Species", x = "Bill Length", y = "Bill Depth")

Yes, this figure explains the surprising observation about the sign of the slopes. When looking at all species together, there is a negative correlation between bill length and bill depth. However, this is misleading because each species occupies a distinct region in the plot. For example, Gentoo penguins have longer but shallower bills, while Chinstrap penguins have shorter but deeper bills. Within each species, the trend is often positive, but when combined, the between-species differences create a negative overall slope. This is an example of Simpson’s paradox.

  1. What is the data set you have selected for your term paper? If you want, you are welcome to discuss with me your progress on the term paper before you turn it in. It is due the last day of classes on Friday, May 2.

Drug_induced_Autoimmunity_Prediction from UCI

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoxLiBXZXJlIGFueSBzcGVjaWVzIGZvdW5kIG9uIGFsbCB0aHJlZSBpc2xhbmRzPyBJZiBzbywgd2hpY2ggb25lKHMpLiBBcmUgdGhlIG51bWJlciBvZiBtYWxlcyBhbmQgZmVtYWxlcyBpbiB0aGUgZGF0YSBzZXQgcm91Z2hseSBiYWxhbmNlZCBmb3IgZWFjaCBzcGVjaWVzPyBOb3RlOiB0aGUg4oCcdGFibGXigJ0gY29tbWFuZCB3aWxsIGJlIHVzZWZ1bCBmb3IgdGhpcyBwcm9ibGVtLgpgYGB7cn0KIyBQYWNrYWdlcwojaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikgIyBoYXNoIG9uY2UgdXNlZApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQoKIyBMb2FkaW5nIHRoZSBkYXRhCnBlbmd1aW5zIDwtIHJlYWQuY3N2KCJwZW5ndWlucy5jc3YiKQoKdGFibGUocGVuZ3VpbnMkc3BlY2llcywgcGVuZ3VpbnMkc2V4KQpgYGAKVGhlIEFkZWxpZSBhbmQgQ2hpbnN0cmFwIGFyZSBwZXJmZWN0bHkgYmFsYW5jZWQgd2hpbGUgdGhlIEdlbnRvbyBpcyByb3VnaGx5IGJhbGFuY2VkICgzIG9mZikKCjIuIE1ha2UgYSBzaWRlLWJ5LXNpZGUgYm94cGxvdCBjb21wYXJpbmcgYmlsbCBsZW5ndGggZm9yIG1hbGVzIGFuZCBmZW1hbGVzLiBEbyBhIHQtdGVzdCB0ZXN0aW5nIHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCBtZWFuIGJpbGwgbGVuZ3RoIGlzIHRoZSBzYW1lIGZvciBtYWxlcyBhbmQgZmVtYWxlcy4gV2hhdCBpcyB5b3VyIGNvbmNsdXNpb24/IE1ha2UgYSBRUS1wbG90IG9mIGJpbGwgbGVuZ3RoIGZvciBtYWxlcywgbWFrZSBhIHNlcGFyYXRlIFFRLSBwbG90IG9mIGJpbGwgbGVuZ3RoIGZvciBmZW1hbGVzLiBBcmUgdGhlIHQtdGVzdCBjb25kaXRpb25zIHNhdGlzZmllZD8gQWxzbyBkbyB0aGUgV2lsY294LSBNYW5uLVdoaXRuZXkgdGVzdC4gRG8gdGhlIHQtdGVzdCBhbmQgV2lsY294LU1hbm4tV2hpdG5leSB0ZXN0IGFncmVlPwpgYGB7cn0KIyBiaWxsIGxlbmd0aCBtYWxlcyB2cyBmZW1hbGVzCmdncGxvdChwZW5ndWlucywgYWVzKHggPSBzZXgsIHkgPSBiaWxsX2xlbmd0aF9tbSkpICsgZ2VvbV9ib3hwbG90KCkgKyBsYWJzKHRpdGxlID0gIkJpbGwgTGVuZ3RoIGJ5IFNleCIsIHggPSAiU2V4IiwgeSA9ICJCaWxsIExlbmd0aCAobW0pIikKCiMgVC10ZXN0CnRfdGVzdCA8LSB0LnRlc3QoYmlsbF9sZW5ndGhfbW0gfiBzZXgsIGRhdGEgPSBwZW5ndWlucykKcHJpbnQodF90ZXN0KQoKIyBRUSBwbG90CnFxbm9ybShwZW5ndWlucyRiaWxsX2xlbmd0aF9tbVtwZW5ndWlucyRzZXggPT0gIm1hbGUiXSwgbWFpbiA9ICJRUSBQbG90OiBNYWxlcyIpCnFxbGluZSAocGVuZ3VpbnMkYmlsbF9sZW5ndGhfbW1bcGVuZ3VpbnMkc2V4ID09ICJtYWxlIl0pCnFxbm9ybShwZW5ndWlucyRiaWxsX2xlbmd0aF9tbVtwZW5ndWlucyRzZXggPT0gImZlbWFsZSJdLCBtYWluID0gIlFRIFBsb3Q6IEZlbWFsZXMiKQpxcWxpbmUocGVuZ3VpbnMkYmlsbF9sZW5ndGhfbW1bcGVuZ3VpbnMkc2V4ID09ICJmZW1hbGUiXSkKCiMgV2lsY294LU1hbm4tV2hpdG5leSB0ZXN0CndtdyA8LSB3aWxjb3gudGVzdChiaWxsX2xlbmd0aF9tbSB+IHNleCwgZGF0YSA9IHBlbmd1aW5zKQpwcmludCh3bXcpCmBgYApNYWxlcyBoYXZlIGEgc3RhdGlzdGljYWxseSBsb25nZXIgYmlsbCBvbiBhdmVyYWdlLiBCb3RoIHRlc3RzIHN0cm9uZ2x5IHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGF0IGEgPSAwLjA1LiBUaGUgdC10ZXN0IGFzc3VtcHRpb25zIGFyZSBub3JtYWwgYW5kIHJvYnVzdCB3aXRoIHRoZSBXaWxjb3hvbiB0ZXN0IGNvbmZpcm1pbmcgaXQuIE92ZXJhbGwsIHllcyBib3RoIHRoZSB0LXRlc3QgYW5kIHRoZSBXTVcgdGVzdCBsZWQgdG8gdGhlIHNhbWUgY29uY2x1c2lvbiBvZiBtYWxlcyBoYXZpbmcgYSBjb25maXJtZWQgbGFyZ2VyIGJlYWsgc2l6ZSBvbiBhdmVyYWdlLgoKMy4gTWFrZSBhIHNpZGUtYnktc2lkZSBib3hwbG90IGNvbXBhcmluZyBiaWxsIGxlbmd0aCBmb3IgYWxsIHRocmVlIHNwZWNpZXMuIERvIGEgb25lLXdheSBBTk9WQSB0byB0ZXN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCBhbGwgdGhyZWUgc3BlY2llIGhhdmUgdGhlIHNhbWUgbWVhbiBiaWxsIGxlbmd0aC4gU2hvdyB0aGUgQU5PVkEgdGFibGUuIFdoYXQgaXMgeW91ciBjb25jbHVzaW9uPyBNYWtlIGEgUVEtcGxvdCBvZiB0aGUgcmVzaWR1YWxzLiBNYWtlIGEgcGxvdCBvZiB0aGUgcmVzaWR1YWxzIHZzLiB0aGUgZ3JvdXAgbWVhbnMuIEFyZSB0aGUgQU5PVkEgY29uZGl0aW9ucyBzYXRpc2ZpZWQ/CmBgYHtyfQojIFNwZWNpZXMnIGJveHBsb3RzCmdncGxvdChwZW5ndWlucywgYWVzKHggPSBzcGVjaWVzLCB5ID0gYmlsbF9sZW5ndGhfbW0pKSArIGdlb21fYm94cGxvdCgpICsgbGFicyh0aXRsZSA9ICJCaWxsIExlbmd0aCBieSBTcGVjaWVzIiwgeCA9ICJTcGVjaWVzIiwgeSA9ICJCaWxsIExlbmd0aCAobW0pIikKCiMgQU5PVkEKYW5vdmFfcmVzdWx0IDwtIGFvdihiaWxsX2xlbmd0aF9tbSB+IHNwZWNpZXMsIGRhdGEgPSBwZW5ndWlucykKc3VtbWFyeSAoYW5vdmFfcmVzdWx0KQoKIyBSZXNpZHVhbHMKcmVzaWR1YWxzX2Fub3ZhIDwtIHJlc2lkdWFscyhhbm92YV9yZXN1bHQpCnFxbm9ybShyZXNpZHVhbHNfYW5vdmEpCnFxbGluZShyZXNpZHVhbHNfYW5vdmEpCmdyb3VwX21lYW5zIDwtIHRhcHBseShwZW5ndWlucyRiaWxsX2xlbmd0aF9tbSwgcGVuZ3VpbnMkc3BlY2llcywgbWVhbiwgbmEucm09VFJVRSkKbWVhbnNfbG9va3VwIDwtIHNldE5hbWVzKGdyb3VwX21lYW5zLCBuYW1lcyhncm91cF9tZWFucykpCmdyb3VwX21lYW5fdmFsdWVzIDwtIG1lYW5zX2xvb2t1cFthcy5jaGFyYWN0ZXIocGVuZ3VpbnMkc3BlY2llcyldCgpwbG90KGdyb3VwX21lYW5fdmFsdWVzLCByZXNpZHVhbHMoYW5vdmFfcmVzdWx0KSwKICAgICBtYWluID0gIlJlc2lkdWFscyB2cyBHcm91cCBNZWFucyIsIHhsYWIgPSAiR3JvdXAgTWVhbiIsIHlsYWIgPSAiUmVzaWR1YWxzIikKYGBgClRoZSBBTk9WQSBjb25kaXRpb25zIGFwcGVhciB0byBiZSBzYXRpc2ZpZWQgYmVjYXVzZSB0aGUgUVEtcGxvdCBvZiByZXNpZHVhbHMgc2hvd3MgdGhhdCB0aGUgcG9pbnRzIGFyZSBhcHByb3hpbWF0ZWx5IGxpbmVhciAobm9ybWFsKSBhbmQgdGhlIHJlc2lkdWFscyB2cyBncm91cCBtZWFucyBwbG90IGRvZXNudCBoYXZlIGEgY2xlYXIgcGF0dGVybiAoaG9tb3NjZWRhc3RpY2l0eSkgY29uZmlybWluZyB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gbWVhbiBiaWxsIGxlbmd0aCBhbW9uZyB0aGUgdGhyZWUgc3BlY2llcy4KCjQuIE1ha2UgYSBzaWRlLWJ5LXNpZGUgYm94cGxvdCBzaG93aW5nIGJpbGwgbGVuZ3RoIGFzIGEgZnVuY3Rpb24gb2YgYm90aCBzZXggYW5kIHNwZWNpZXMuIERvIGEgdHdvLXdheSBBTk9WQS4gU2hvdyB0aGUgQU5PVkEgdGFibGUuIEZvciBhIHR3by13YXkgQU5PVkEgdGhlcmUgYXJlIHRocmVlIG51bGwgaHlwb3RoZXNlcywgd2hhdCBhcmUgeW91ciB0aHJlZSBjb25jbHVzaW9ucz8gTWFrZSBhIFFRLXBsb3Qgb2YgdGhlIHJlc2lkdWFscy4gTWFrZSBhIHBsb3Qgb2YgdGhlIHJlc2lkdWFscyB2cy4gdGhlIGdyb3VwIG1lYW5zLiBBcmUgdGhlIEFOT1ZBIGNvbmRpdGlvbnMgc2F0aXNmaWVkPwpgYGB7cn0KZ2dwbG90KHBlbmd1aW5zLCBhZXMoeCA9IHNwZWNpZXMsIHkgPSBiaWxsX2xlbmd0aF9tbSwgZmlsbCA9IHNleCkpICsgZ2VvbV9ib3hwbG90KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC44KSkgKyBsYWJzKHRpdGxlID0gIkJpbGwgTGVuZ3RoIGJ5IFNleCBhbmQgU3BlY2llcyIsIHggPSAiU3BlY2llcyIsIHkgPSAiQmlsbCBMZW5ndGggKG1tKSIpCgojIDItd2F5IEFOT1ZBCnR3b193YXkgPC0gYW92KGJpbGxfbGVuZ3RoX21tIH4gc3BlY2llcyAqIHNleCwgZGF0YSA9IHBlbmd1aW5zKQpzdW1tYXJ5KHR3b193YXkpCgojIENoZWNraW5nIHJlc2lkdWFscwpyZXNpZHVhbHNfdHdvX3dheSA8LSByZXNpZHVhbHModHdvX3dheSkKcXFub3JtKHJlc2lkdWFsc190d29fd2F5KQpxcWxpbmUocmVzaWR1YWxzX3R3b193YXkpCgppbnRlcmFjdGlvbl9ncm91cHMgPC0gaW50ZXJhY3Rpb24ocGVuZ3VpbnMkc3BlY2llcywgcGVuZ3VpbnMkc2V4KQpncm91cF9tZWFuc18yd2F5IDwtIHRhcHBseShwZW5ndWlucyRiaWxsX2xlbmd0aF9tbSwgaW50ZXJhY3Rpb25fZ3JvdXBzLCBtZWFuLCBuYS5ybT1UUlVFKQptZWFuc19sb29rdXBfMndheSA8LSBzZXROYW1lcyhncm91cF9tZWFuc18yd2F5LCBuYW1lcyhncm91cF9tZWFuc18yd2F5KSkKZ3JvdXBfbWVhbl92YWx1ZXNfMndheSA8LSBtZWFuc19sb29rdXBfMndheVthcy5jaGFyYWN0ZXIoaW50ZXJhY3Rpb25fZ3JvdXBzKV0KCnBsb3QoZ3JvdXBfbWVhbl92YWx1ZXNfMndheSwgcmVzaWR1YWxzKHR3b193YXkpLAogICAgIG1haW4gPSAiUmVzaWR1YWxzIHZzIEdyb3VwIE1lYW5zIChUd28td2F5IEFOT1ZBKSIsIHhsYWIgPSAiR3JvdXAgTWVhbiIsIHlsYWIgPSAiUmVzaWR1YWxzIikKYGBgCldlIHRlc3RlZCBpZiB0aGVyZSB3YXMgbm8gZGlmZmVyZW5jZSBpbiBiaWxsIGxlbmd0aCBhbW9uZyBzcGVjaWVzLCB0aGF0IHdhcyByZWplY3RlZCBhcyBudWxsIGR1ZSB0byBwIDwgMmUtMTYuIFdlIHRlc3RlZCBpZiB0aGVyZSB3YXMgbm8gZGlmZmVyZW5jZSBpbiBiaWxsIGxlbmd0aCBhbW9uZyBzZXhlcywgdGhhdCB3YXMgcmVqZWN0ZWQgYXMgbnVsbCBkdWUgdG8gcCA8IDJlLTE2LiBUaGVuIHdlIHRlc3RlZCBpZiB0aGVyZSB3YXMgbm8gaW50ZXJhY3Rpb24gYmV0d2VlbiBzcGVjaWVzIGFuZCBzZXgsIHdoaWNoIHdlIGRpZG4ndCByZWplY3QgYXMgbnVsbCBiZWNhdXNlIHAgPSAwLjEwMy4gVGhlIEFOT1ZBIGNvbmRpdGlvbnMgYXBwZWFyIHRvIGJlIHNhdGlzZmllZCBiZWNhdXNlIHRoZSBRUS1wbG90IG9mIHJlc2lkdWFscyBzaG93cyB0aGF0IHRoZSBwb2ludHMgYXJlIGFwcHJveGltYXRlbHkgbGluZWFyIChub3JtYWwpIGFuZCB0aGUgcmVzaWR1YWxzIHZzIGdyb3VwIG1lYW5zIHBsb3QgZG9lc250IGhhdmUgYSBjbGVhciBwYXR0ZXJuIChob21vc2NlZGFzdGljaXR5KSBjb25maXJtaW5nIHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBtZWFuIGJpbGwgbGVuZ3RoIGFtb25nIHRoZSB0aHJlZSBzcGVjaWVzLgoKNS4gTWFrZSBhIHNjYXR0ZXIgcGxvdCB3aXRoIGJpbGwgbGVuZ3RoIG9uIHRoZSB4LWF4aXMgYW5kIGJpbGwgZGVwdGggb24gdGhlIHktYXhpcy4gQ29tcHV0ZSB0aGUgY29ycmVsYXRpb24uIENvbXB1dGUgdGhlIGxlYXN0IHNxdWFyZXMgbGluZSwgYW5kIGFkZCB0aGUgbGVhc3Qgc3F1YXJlcyBsaW5lIHRvIHlvdXIgcGxvdC4gSXMgdGhlIHNsb3BlIChhbmQgdGhlIGNvcnJlbGF0aW9uKSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCB0aGFuIHplcm8/IElmIHNvLCBkb2VzIHRoZSBzaWduIG9mIHRoZSBzbG9wZSAoYW5kIGNvcnJlbGF0aW9uKSBzdXJwcmlzZSB5b3U/IE1ha2UgYSBRUS1wbG90IG9mIHRoZSByZXNpZHVhbHMuIE1ha2UgYSBwbG90IHdpdGggYmlsbCBsZW5ndGggb24gdGhlIHgtYXhpcyBhbmQgdGhlIHJlc2lkdWFscyBvbiB0aGUgeS1heGlzLiBBcmUgdGhlIGxpbmVhciBtb2RlbCBhc3N1bXB0aW9ucyBzYXRpc2ZpZWQ/CmBgYHtyfQojIFNjYXR0ZXIgcGxvdCArIExSIGZvciBhbGwgc3BlY2llcwpnZ3Bsb3QocGVuZ3VpbnMsIGFlcyh4ID0gYmlsbF9sZW5ndGhfbW0sIHkgPSBiaWxsX2RlcHRoX21tKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArIGxhYnModGl0bGUgPSAiQmlsbCBMZW5ndGggdnMgQmlsbCBEZXB0aCIsIHggPSAiQmlsbCBMZW5ndGggKG1tKSIsIHkgPSAiQmlsbCBEZXB0aCAobW0pIikKY29yKHBlbmd1aW5zJGJpbGxfbGVuZ3RoX21tLCBwZW5ndWlucyRiaWxsX2RlcHRoX21tLCB1c2UgPSAiY29tcGxldGUub2JzIikKbG1fYWxsIDwtIGxtKGJpbGxfZGVwdGhfbW0gfiBiaWxsX2xlbmd0aF9tbSwgZGF0YSA9IHBlbmd1aW5zKQpzdW1tYXJ5IChsbV9hbGwpCgojIHJlc2lkdWFscwpyZXNpZHVhbHNfbG0gPC0gcmVzaWR1YWxzKGxtX2FsbCkKcXFub3JtKHJlc2lkdWFsc19sbSkKcXFsaW5lKHJlc2lkdWFsc19sbSkKCnBsb3QocGVuZ3VpbnMkYmlsbF9sZW5ndGhfbW0sIHJlc2lkdWFsc19sbSwgbWFpbiA9ICJSZXNpZHVhbHMgdnMgQmlsbCBMZW5ndGgiLCB4bGFiID0gIkJpbGwgTGVuZ3RoIChtbSkiLCB5bGFiID0gIlJlc2lkdWFscyIpCmBgYApXZSB0ZXN0ZWQgaWYgdGhlIHNsb3BlIGJldHdlZW4gYmlsbCBsZW5ndGggYW5kIGJpbGwgZGVwdGggd2FzIHplcm8sIHdoaWNoIHdhcyByZWplY3RlZCBhcyBudWxsIGJlY2F1c2UgdGhlIHAtdmFsdWUgd2FzIDIuNTNlLTA1LiBXZSBhbHNvIHRlc3RlZCBpZiB0aGUgY29ycmVsYXRpb24gd2FzIHplcm8sIGFuZCB0aGF0IHdhcyBhbHNvIHJlamVjdGVkIGFzIG51bGwgZHVlIHRvIHRoZSBzYW1lIHAtdmFsdWUuIFRoZSBuZWdhdGl2ZSBzaWduIG9mIGJvdGggdGhlIHNsb3BlIGFuZCB0aGUgY29ycmVsYXRpb24gd2FzIHN1cnByaXNpbmcsIHNpbmNlIHdlIG1pZ2h0IGV4cGVjdCBsb25nZXIgYmlsbHMgdG8gYWxzbyBiZSBkZWVwZXIuIFRoZSBsaW5lYXIgbW9kZWwgYXNzdW1wdGlvbnMgYXBwZWFyIHRvIGJlIHNhdGlzZmllZCBiZWNhdXNlIHRoZSBRUS1wbG90IG9mIHJlc2lkdWFscyBzaG93cyB0aGF0IHRoZSBwb2ludHMgYXJlIGFwcHJveGltYXRlbHkgbGluZWFyIChub3JtYWwpLCBhbmQgdGhlIHJlc2lkdWFscyB2cyBiaWxsIGxlbmd0aCBwbG90IGRvZXMgbm90IHNob3cgYW55IHN0cm9uZyBjdXJ2YXR1cmUgb3Igc3ByZWFkIChob21vc2NlZGFzdGljaXR5KS4gVGhlIGNvbG9yLWNvZGVkIHBsb3QgYnkgc3BlY2llcyBoZWxwcyBleHBsYWluIHRoZSBzdXJwcmlzaW5nIG5lZ2F0aXZlIHNsb3BlLCBzaW5jZSBkaWZmZXJlbnQgc3BlY2llcyBoYXZlIGRpc3RpbmN0IGJpbGwgc2hhcGVzIChlLmcuLCBHZW50b28gcGVuZ3VpbnMgaGF2ZSBsb25nZXIsIHNoYWxsb3dlciBiaWxscyB3aGlsZSBDaGluc3RyYXAgaGF2ZSBzaG9ydGVyLCBkZWVwZXIgb25lcyksIHdoaWNoIGNyZWF0ZXMgYSBtaXNsZWFkaW5nIG5lZ2F0aXZlIHRyZW5kIGFjcm9zcyBhbGwgc3BlY2llcyBldmVuIGlmIHRoZSB0cmVuZCB3aXRoaW4gZWFjaCBzcGVjaWVzIGlzIHBvc2l0aXZlLgoKTmV4dCByZXBlYXQgZXZlcnl0aGluZyBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoLCBidXQganVzdCBmb3IgdGhlIHNwZWNpZXMgQWRlbGllLgpgYGB7cn0KYWRlbGllIDwtIGZpbHRlcihwZW5ndWlucywgc3BlY2llcyA9PSAiQWRlbGllIikKCmdncGxvdChhZGVsaWUsIGFlcyh4ID0gYmlsbF9sZW5ndGhfbW0sIHkgPSBiaWxsX2RlcHRoX21tKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnModGl0bGUgPSAiQWRlbGllOiBCaWxsIExlbmd0aCB2cyBCaWxsIERlcHRoIiwgeCA9ICJCaWxsIExlbmd0aCIsIHkgPSAiQmlsbCBEZXB0aCIpCgpjb3IoYWRlbGllJGJpbGxfbGVuZ3RoX21tLCBhZGVsaWUkYmlsbF9kZXB0aF9tbSwgdXNlID0gImNvbXBsZXRlLm9icyIpCgpsbV9hZGVsaWUgPC0gbG0oYmlsbF9kZXB0aF9tbSB+IGJpbGxfbGVuZ3RoX21tLCBkYXRhID0gYWRlbGllKQpzdW1tYXJ5KGxtX2FkZWxpZSkKCnJlc2lkdWFsc19hZGVsaWUgPC0gcmVzaWR1YWxzKGxtX2FkZWxpZSkKcXFub3JtKHJlc2lkdWFsc19hZGVsaWUpCnFxbGluZShyZXNpZHVhbHNfYWRlbGllKQoKcGxvdChhZGVsaWUkYmlsbF9sZW5ndGhfbW0sIHJlc2lkdWFsc19hZGVsaWUsCiAgICAgbWFpbiA9ICJBZGVsaWUgUmVzaWR1YWxzIHZzIEJpbGwgTGVuZ3RoIiwgeGxhYiA9ICJCaWxsIExlbmd0aCIsIHlsYWIgPSAiUmVzaWR1YWxzIikKYGBgCldlIHRlc3RlZCBpZiB0aGUgc2xvcGUgYmV0d2VlbiBiaWxsIGxlbmd0aCBhbmQgYmlsbCBkZXB0aCBmb3IgQWRlbGllIHBlbmd1aW5zIHdhcyB6ZXJvLCB3aGljaCB3ZSByZWplY3RlZCBhcyBudWxsIGJlY2F1c2UgdGhlIHAtdmFsdWUgd2FzIDEuNTFlLTA2LiBXZSBhbHNvIHRlc3RlZCBpZiB0aGUgY29ycmVsYXRpb24gd2FzIHplcm8sIHdoaWNoIHdhcyByZWplY3RlZCBhcyBudWxsIHNpbmNlIHRoZSBjb3JyZWxhdGlvbiB3YXMgMC4zODYgd2l0aCBhIHNpZ25pZmljYW50IHAtdmFsdWUuIFRoZSBwb3NpdGl2ZSBzbG9wZSBhbmQgY29ycmVsYXRpb24gYXJlIG5vdCBzdXJwcmlzaW5nIGZvciB0aGlzIHNwZWNpZXMsIHNpbmNlIGl0IG1ha2VzIHNlbnNlIHRoYXQgbG9uZ2VyIGJpbGxzIHdvdWxkIGFsc28gYmUgZGVlcGVyLiBUaGUgbGluZWFyIG1vZGVsIGFzc3VtcHRpb25zIGFwcGVhciB0byBiZSBzYXRpc2ZpZWQgYmVjYXVzZSB0aGUgUVEtcGxvdCBvZiByZXNpZHVhbHMgaXMgYXBwcm94aW1hdGVseSBsaW5lYXIgKG5vcm1hbCksIGFuZCB0aGUgcmVzaWR1YWxzIHZzIGJpbGwgbGVuZ3RoIHBsb3Qgc2hvd3Mgbm8gc3Ryb25nIHBhdHRlcm5zIG9yIGZhbm5pbmcgKGhvbW9zY2VkYXN0aWNpdHkpLgoKCkZpbmFsbHkgbWFrZSBhbm90aGVyIHNjYXR0ZXIgcGxvdCB3aXRoIGJpbGwgbGVuZ3RoIG9uIHRoZSB4LWF4aXMgYW5kIGJpbGwgZGVwdGggb24gdGhlIHktIGF4aXMuIFRoaXMgcGxvdCBzaG91bGQgaW5jbHVkZSBhbGwgdGhyZWUgc3BlY2llcywgYnV0IHRoZSBzcGVjaWVzIHNob3VsZCBiZSBjb2xvci1jb2RlZCAoaS5lLiwgdXNlIG9uZSBjb2xvciBmb3IgdGhlIEFkZWxpZSBwZW5ndWlucywgYSBzZWNvbmQgY29sb3IgZm9yIHRoZSBDaGluc3RyYXAgcGVuZ3VpbnMsMSBhbmQgYSB0aGlyZCBjb2xvciBmb3IgdGhlIEdlbnRvbyBwZW5ndWlucykuIERvZXMgdGhpcyBmaWd1cmUgZXhwbGFpbiB0aGUgc3VycHJpc2luZyBvYnNlcnZhdGlvbiBhYm91dCB0aGUgc2lnbiBvZiB0aGUgc2xvcGVzPwpgYGB7cn0KZ2dwbG90KHBlbmd1aW5zLCBhZXMoeCA9IGJpbGxfbGVuZ3RoX21tLCB5ID0gYmlsbF9kZXB0aF9tbSwgY29sb3IgPSBzcGVjaWVzKSkgKwogIGdlb21fcG9pbnQoKSArCiAgbGFicyh0aXRsZSA9ICJCaWxsIERpbWVuc2lvbnMgYnkgU3BlY2llcyIsIHggPSAiQmlsbCBMZW5ndGgiLCB5ID0gIkJpbGwgRGVwdGgiKQpgYGAKWWVzLCB0aGlzIGZpZ3VyZSBleHBsYWlucyB0aGUgc3VycHJpc2luZyBvYnNlcnZhdGlvbiBhYm91dCB0aGUgc2lnbiBvZiB0aGUgc2xvcGVzLiBXaGVuIGxvb2tpbmcgYXQgYWxsIHNwZWNpZXMgdG9nZXRoZXIsIHRoZXJlIGlzIGEgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBiaWxsIGxlbmd0aCBhbmQgYmlsbCBkZXB0aC4gSG93ZXZlciwgdGhpcyBpcyBtaXNsZWFkaW5nIGJlY2F1c2UgZWFjaCBzcGVjaWVzIG9jY3VwaWVzIGEgZGlzdGluY3QgcmVnaW9uIGluIHRoZSBwbG90LiBGb3IgZXhhbXBsZSwgR2VudG9vIHBlbmd1aW5zIGhhdmUgbG9uZ2VyIGJ1dCBzaGFsbG93ZXIgYmlsbHMsIHdoaWxlIENoaW5zdHJhcCBwZW5ndWlucyBoYXZlIHNob3J0ZXIgYnV0IGRlZXBlciBiaWxscy4gV2l0aGluIGVhY2ggc3BlY2llcywgdGhlIHRyZW5kIGlzIG9mdGVuIHBvc2l0aXZlLCBidXQgd2hlbiBjb21iaW5lZCwgdGhlIGJldHdlZW4tc3BlY2llcyBkaWZmZXJlbmNlcyBjcmVhdGUgYSBuZWdhdGl2ZSBvdmVyYWxsIHNsb3BlLiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgU2ltcHNvbuKAmXMgcGFyYWRveC4KCjYuIFdoYXQgaXMgdGhlIGRhdGEgc2V0IHlvdSBoYXZlIHNlbGVjdGVkIGZvciB5b3VyIHRlcm0gcGFwZXI/IElmIHlvdSB3YW50LCB5b3UgYXJlIHdlbGNvbWUgdG8gZGlzY3VzcyB3aXRoIG1lIHlvdXIgcHJvZ3Jlc3Mgb24gdGhlIHRlcm0gcGFwZXIgYmVmb3JlIHlvdSB0dXJuIGl0IGluLiBJdCBpcyBkdWUgdGhlIGxhc3QgZGF5IG9mIGNsYXNzZXMgb24gRnJpZGF5LCBNYXkgMi4KCkRydWdfaW5kdWNlZF9BdXRvaW1tdW5pdHlfUHJlZGljdGlvbiBmcm9tIFVDSQo=